/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entidade.registroimovel.Imovel;
import br.com.deployment.entidade.registroimovel.Transferencia;
import br.com.deployment.interfaces.TransferenciaDaoIn;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author luciano
 */
@Stateless
@LocalBean
public class TransferenciaDao extends DaoGenerico<Transferencia> implements TransferenciaDaoIn{

    public TransferenciaDao() {
        super(Transferencia.class);
    }
    
    /*
    public List<Transferencia> findTransferir(Transferencia transferencia) {
        return null;
    }

    public Transferencia verificaUltimaTrans(int idImovel) {
        Transferencia t = new Transferencia();

        Query q = getEm().createQuery("Select MAX(t.id) from Transferencia t where t.imovel.id = :id");
        q.setParameter("id", idImovel);

        Integer aux = Integer.parseInt(q.getSingleResult().toString());

        Query q1 = getEm().createQuery("Select t from Transferencia t where t.id= :id");
        q1.setParameter("id", aux);

        t = (Transferencia) q1.getResultList().get(0);


        return t;

    }

    public Transferencia verificaPrimeiraTrans(int idImovel) {
        Transferencia t = new Transferencia();

        Query q = getEm().createQuery("Select MIN(t.id) from Transferencia t where t.imovel.id = :id");
        q.setParameter("id", idImovel);

        Integer aux = Integer.parseInt(q.getSingleResult().toString());

        Query q1 = getEm().createQuery("Select t from Transferencia t where t.id= :id");
        q1.setParameter("id", aux);

        t = (Transferencia) q1.getResultList().get(0);


        return t;

    }

    /**
     * Retorna a última transferência do imóvel
     *
     * @param imovel
     * @param pessoaAdquirente
     * @param pessoaTransmitente
     * @return
     */
//    public List<Transferencia> findTransImovel(Imovel imovel, Pessoa pessoaAdquirente, Pessoa pessoaTransmitente) {
//        List<Transferencia> lista = new ArrayList<Transferencia>();
//
//        System.err.println("----" + pessoaAdquirente);
//
//        String sql = " select t from Transferencia t ";
//
//
//        if (imovel != null) {
//            sql += " JOIN t.imovel i ";
//        }
//        if (pessoaAdquirente != null) {
//            sql += " JOIN t.adquirente a ";
//        }
//        if (pessoaTransmitente != null) {
//            sql += " JOIN t.transmitente tra ";
//        }
//
//        sql += " where  t.id = (Select max(tr.id) from Transferencia tr where tr.imovel = t.imovel) and";
//
//        if (imovel != null) {
//            if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
//                sql += " lower(i.registro) like lower(:registro) and ";
//            }
//        }
//        //adquirente
//        if (pessoaAdquirente != null) {
//            sql += " ";
//            if (pessoaAdquirente.getNome() != null && pessoaAdquirente.getNome() != "") {
//                sql += " lower(a.nome) like lower(:nome) and ";
//                if (pessoaAdquirente.getTipo() != null) {
//                    sql += " a.tipo = :tipo and ";
//                }
//            }
//            if (pessoaAdquirente.getCpf() != null && pessoaAdquirente.getCpf() != "") {
//                sql += " lower(a.cpf) like lower(:cpf) and ";
//                if (pessoaAdquirente.getTipo() != null) {
//                    sql += " a.tipo = :tipo and ";
//                }
//            }
//            if (pessoaAdquirente.getRg() != null && pessoaAdquirente.getRg() != "") {
//                sql += " lower(a.rg) like lower(:rg) and ";
//                if (pessoaAdquirente.getTipo() != null) {
//                    sql += " a.tipo = :tipo and ";
//                }
//            }
//            if (pessoaAdquirente.getCnpj() != null && pessoaAdquirente.getCnpj() != "") {
//                sql += " lower(a.cnpj) like lower(:cnpj) and ";
//                if (pessoaAdquirente.getTipo() != null) {
//                    sql += " a.tipo = :tipo and ";
//                }
//            }
//
//        }
//
//        //transmitente
//        if (pessoaTransmitente != null) {
//            sql += " ";
//
//            if (pessoaTransmitente.getNome() != null && pessoaTransmitente.getNome() != "") {
//                sql += " lower(tra.nome) like lower(:nome) and ";
//                if (pessoaTransmitente.getTipo() != null) {
//                    sql += " tra.tipo = :tipo and ";
//                }
//            }
//            if (pessoaTransmitente.getCpf() != null && pessoaTransmitente.getCpf() != "") {
//                sql += " lower(tra.cpf) like lower(:cpf) and ";
//                if (pessoaTransmitente.getTipo() != null) {
//                    sql += " tra.tipo = :tipo and ";
//                }
//            }
//            if (pessoaTransmitente.getRg() != null && pessoaTransmitente.getRg() != "") {
//                sql += " lower(tra.rg) like lower(:rg) and ";
//            }
//            if (pessoaTransmitente.getCnpj() != null && pessoaTransmitente.getCnpj() != "") {
//                sql += " lower(tra.cnpj) like lower(:cnpj) and ";
//                if (pessoaTransmitente.getTipo() != null) {
//                    sql += " tra.tipo = :tipo and ";
//                }
//            }
//
//        }
//
//
//        sql += " 1=1 ";
//        if (imovel != null) {
//            sql += "GROUP BY t.imovel ";
//        }
//
//        Query query = getEm().createQuery(sql);
//        //aqdquirente
//        if (pessoaAdquirente != null) {
//            if (pessoaAdquirente.getNome() != null && pessoaAdquirente.getNome() != "") {
//                query.setParameter("nome", "%" + pessoaAdquirente.getNome() + "%");
//                if (pessoaAdquirente.getTipo() != null) {
//                    query.setParameter("tipo", pessoaAdquirente.getTipo());
//                }
//            }
//            if (pessoaAdquirente.getCpf() != null && pessoaAdquirente.getCpf() != "") {
//                query.setParameter("cpf", "%" + pessoaAdquirente.getCpf() + "%");
//            }
//            if (pessoaAdquirente.getRg() != null && pessoaAdquirente.getRg() != "") {
//                query.setParameter("rg", "%" + pessoaAdquirente.getRg() + "%");
//            }
//            if (pessoaAdquirente.getCnpj() != null && pessoaAdquirente.getCnpj() != "") {
//                query.setParameter("cnpj", "%" + pessoaAdquirente.getCnpj() + "%");
//            }
//
//        }
//
//        //transmitente
//        if (pessoaTransmitente != null) {
//            if (pessoaTransmitente.getNome() != null && pessoaTransmitente.getNome() != "") {
//                query.setParameter("nome", "%" + pessoaTransmitente.getNome() + "%");
//                if (pessoaTransmitente.getTipo() != null) {
//                    query.setParameter("tipo", pessoaTransmitente.getTipo());
//                }
//            }
//            if (pessoaTransmitente.getCpf() != null && pessoaTransmitente.getCpf() != "") {
//                query.setParameter("cpf", "%" + pessoaTransmitente.getCpf() + "%");
//            }
//            if (pessoaTransmitente.getRg() != null && pessoaTransmitente.getRg() != "") {
//                query.setParameter("rg", "%" + pessoaTransmitente.getRg() + "%");
//            }
//            if (pessoaTransmitente.getCnpj() != null && pessoaTransmitente.getCnpj() != "") {
//                query.setParameter("cnpj", "%" + pessoaTransmitente.getCnpj() + "%");
//            }
//
//
//        }
//
//
//        //registro
//        if (imovel != null) {
//            if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
//                query.setParameter("registro", "%" + imovel.getRegistro() + "%");
//            }
//        }
//
//        lista = query.getResultList();
//        System.err.println(sql + "");
//        for (Transferencia tra : lista) {
//            System.err.println(tra);
//        }
//        return lista;
//    }
//
//    public List<Transferencia> findImovelAll(Imovel imovel, String str) {
//        List<Transferencia> lista = new ArrayList<Transferencia>();
//
//        String sql = "select t from Transferencia t JOIN t.imovel i"
//                + " where ";
//        if (imovel != null) {
//            if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
//                sql += " lower(i.registro) like lower(:registro) and";
//            }
//            sql += " t.imovel.id = i.id ";
//            sql += " ORDER BY t.id " + str.toUpperCase();
//        }
//
//        Query query = getEm().createQuery(sql);
//        //registro
//        if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
//            query.setParameter("registro", "" + imovel.getRegistro());
//        }
//
//        lista = query.getResultList();
//        return lista;
//    }
     
    @Override
    public List<Transferencia> findAll() {
        Query q = getEm().createQuery("From Transferir");
        return q.getResultList();
    }

    
    @Override
    public List<Transferencia> findTransferir(Transferencia transferencia) {

        return null;
    }

    
    @Override
    public Transferencia verificaUltimaTrans(int idImovel) {
        Transferencia t = new Transferencia();

        Query q = getEm().createQuery(""
                + "Select t from Transferencia t where t.id = "
                + " (Select MAX(ti.id) from Transferencia ti JOIN ti.imovel imo where"
                + " imo.id = :id)");
        
        q.setParameter("id", idImovel);
        t = (Transferencia) q.getResultList().get(0);
        
        return t;

    }

    
    @Override
    public Transferencia verificaPrimeiraTrans(int idImovel) {
        Transferencia t = new Transferencia();

        Query q = getEm().createQuery("Select MIN(t.id) from Transferencia t where t.imovel.id = :id");
        q.setParameter("id", idImovel);

        Integer aux = Integer.parseInt(q.getSingleResult().toString());

        Query q1 = getEm().createQuery("Select t from Transferencia t where t.id= :id");
        q1.setParameter("id", aux);

        t = (Transferencia) q1.getResultList().get(0);


        return t;

    }

    /**
     * Retorna a última transferência do imóvel
     *
     * @param imovel
     * @param pessoaAdquirente
     * @param pessoaTransmitente
     * @return
     */
    
    @Override
    public List<Transferencia> findTransImovel(Imovel imovel, Pessoa pessoaAdquirente, Pessoa pessoaTransmitente,  Boolean anterior) {
        List<Transferencia> lista = new ArrayList<Transferencia>();


        String sql = " select t from Transferencia t ";


            sql += " JOIN t.imovel i "; // aqui
            
       if(imovel != null && imovel.getObjeto() != null){
            sql += " JOIN i.objeto o";
        }
        

        if (pessoaAdquirente != null) {
            sql += " JOIN t.adquirente a "; // aqui
        }
        if (pessoaTransmitente != null) {
            sql += " JOIN t.transmitente tra ";
        }

        if(anterior != null && anterior == true){
            sql += " where  t.id != (Select max(tr.id) from Transferencia tr JOIN tr.imovel ir where ir.id = i.id) and"; // aqui
        }else{
            sql += " where  t.id = (Select max(tr.id) from Transferencia tr JOIN tr.imovel ir where ir.id = i.id) and"; // aqui
        }
        
        if (imovel != null) {
            if (imovel.getRegistro() != null){// || !"".equals(imovel.getRegistro())) {
                sql += " lower(i.registro) like lower(:registro) and "; // aqui
            }
        }
        //adquirente
        if (pessoaAdquirente != null) {
            sql += " ";
            if (pessoaAdquirente.getNome() != null && !"".equals(pessoaAdquirente.getNome())) {
                sql += " lower(a.nome) like lower(:nome) and "; // aqui
                if (pessoaAdquirente.getTipo() != null) {
                    sql += " a.tipo = :tipo and ";
                }
            }
            if (pessoaAdquirente.getCpf() != null && !"".equals(pessoaAdquirente.getCpf())) {
                sql += " lower(a.cpf) like lower(:cpf) and ";
                if (pessoaAdquirente.getTipo() != null) {
                    sql += " a.tipo = :tipo and ";
                }
            }
            if (pessoaAdquirente.getRg() != null && !"".equals(pessoaAdquirente.getRg())) {
                sql += " lower(a.rg) like lower(:rg) and ";
                if (pessoaAdquirente.getTipo() != null) {
                    sql += " a.tipo = :tipo and ";
                }
            }
            if (pessoaAdquirente.getCnpj() != null && !"".equals(pessoaAdquirente.getCnpj())) {
                sql += " lower(a.cnpj) like lower(:cnpj) and ";
                if (pessoaAdquirente.getTipo() != null) {
                    sql += " a.tipo = :tipo and ";
                }
            }

        }

        //transmitente
        if (pessoaTransmitente != null) {
            sql += " ";

            if (pessoaTransmitente.getNome() != null && !"".equals(pessoaTransmitente.getNome())) {
                sql += " lower(tra.nome) like lower(:nome) and ";
                if (pessoaTransmitente.getTipo() != null) {
                    sql += " tra.tipo = :tipo and ";
                }
            }
            if (pessoaTransmitente.getCpf() != null && !"".equals(pessoaTransmitente.getCpf())) {
                sql += " lower(tra.cpf) like lower(:cpf) and ";
                if (pessoaTransmitente.getTipo() != null) {
                    sql += " tra.tipo = :tipo and ";
                }
            }
            if (pessoaTransmitente.getRg() != null && !"".equals(pessoaTransmitente.getRg())) {
                sql += " lower(tra.rg) like lower(:rg) and ";
            }
            if (pessoaTransmitente.getCnpj() != null && !"".equals(pessoaTransmitente.getCnpj())) {
                sql += " lower(tra.cnpj) like lower(:cnpj) and ";
                if (pessoaTransmitente.getTipo() != null) {
                    sql += " tra.tipo = :tipo and ";
                }
            }

        }
        if(imovel != null && imovel.getObjeto() != null){
            if(imovel.getObjeto().getLogradouro() != null){
                sql += " lower(o.logradouro) like lower(:logradouro) and";
            }
            if(imovel.getObjeto().getNumero() != null){
                sql += " lower(o.numero) like lower(:numero) and";
            }
            if(imovel.getObjeto().getBairro() != null){
                sql += " lower(o.bairro) like lower(:bairro) and";
            }
            if(imovel.getObjeto().getCidade() != null && imovel.getObjeto().getCidade().getCod_cidade() != 0){
                sql += " o.cidade.cod_cidade = :cidade and";
            }
            if(imovel.getObjeto().getTipo() != null){
                sql += " lower(o.tipo) like lower(:tipo) and";
            }
        }
        sql += " 1=1 "; // aqui
        if (imovel != null) {
            sql += "GROUP BY t.imovel "; // aqui
        }

        Query query = getEm().createQuery(sql);
        
          if(imovel != null && imovel.getObjeto() != null){
            if(imovel.getObjeto().getLogradouro() != null){
                query.setParameter("logradouro", "%"+imovel.getObjeto().getLogradouro()+"%");
            }
            if(imovel.getObjeto().getNumero() != null){
                query.setParameter("numero", "%"+imovel.getObjeto().getNumero()+"%");
            }
            if(imovel.getObjeto().getBairro() != null){
                query.setParameter("bairro", "%"+imovel.getObjeto().getBairro()+"%");
            }
            if(imovel.getObjeto().getCidade() != null && imovel.getObjeto().getCidade().getCod_cidade() != 0){
                query.setParameter("cidade", imovel.getObjeto().getCidade().getCod_cidade());
            }
            if(imovel.getObjeto().getTipo() != null){
                query.setParameter("tipo", "%"+imovel.getObjeto().getTipo().getNome()+"%");
            }
        }
               
           
           
        //aqdquirente
        if (pessoaAdquirente != null) {
            if (pessoaAdquirente.getNome() != null && !"".equals(pessoaAdquirente.getNome())) {
                query.setParameter("nome", "%" + pessoaAdquirente.getNome() + "%");
                if (pessoaAdquirente.getTipo() != null) {
                    query.setParameter("tipo", pessoaAdquirente.getTipo());
                }
            }
            if (pessoaAdquirente.getCpf() != null && !"".equals(pessoaAdquirente.getCpf())) {
                query.setParameter("cpf", "%" + pessoaAdquirente.getCpf() + "%");
            }
            if (pessoaAdquirente.getRg() != null && !"".equals(pessoaAdquirente.getRg())) {
                query.setParameter("rg", "%" + pessoaAdquirente.getRg() + "%");
            }
            if (pessoaAdquirente.getCnpj() != null && !"".equals(pessoaAdquirente.getCnpj())) {
                query.setParameter("cnpj", "%" + pessoaAdquirente.getCnpj() + "%");
            }

        }

        //transmitente
        if (pessoaTransmitente != null) {
            if (pessoaTransmitente.getNome() != null && !"".equals(pessoaTransmitente.getNome())) {
                query.setParameter("nome", "%" + pessoaTransmitente.getNome() + "%");
                if (pessoaTransmitente.getTipo() != null) {
                    query.setParameter("tipo", pessoaTransmitente.getTipo());
                }
            }
            if (pessoaTransmitente.getCpf() != null && !"".equals(pessoaTransmitente.getCpf())) {
                query.setParameter("cpf", "%" + pessoaTransmitente.getCpf() + "%");
            }
            if (pessoaTransmitente.getRg() != null && !"".equals(pessoaTransmitente.getRg())) {
                query.setParameter("rg", "%" + pessoaTransmitente.getRg() + "%");
            }
            if (pessoaTransmitente.getCnpj() != null && !"".equals(pessoaTransmitente.getCnpj())) {
                query.setParameter("cnpj", "%" + pessoaTransmitente.getCnpj() + "%");
            }


        }


        //registro
        if (imovel != null) {
            if (imovel.getRegistro() != null){// || !"".equals(imovel.getRegistro())) {
                query.setParameter("registro", "%" + imovel.getRegistro() + "%");
            }
        }

        lista = query.getResultList();
        System.err.println(sql + "");
        for (Transferencia tra : lista) {
            System.err.println("Resul: "+tra);
        }
        return lista;
        
        
    }

    
    @Override
    public List<Transferencia> findImovelAll(Imovel imovel, String str) {
        List<Transferencia> lista = new ArrayList<Transferencia>();

        String sql = "select t from Transferencia t JOIN t.imovel i"
                + " where ";
        if (imovel != null) {
            if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
                sql += " lower(i.registro) like lower(:registro) and";
            }
            sql += " t.imovel.id = i.id AND ";
            sql += " i.id = :id";
            sql += " ORDER BY t.id " + str.toUpperCase();
        }

        Query query = getEm().createQuery(sql);
         query.setParameter("id", imovel.getId());
        //registro
        if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
            query.setParameter("registro", "" + imovel.getRegistro());
        }
        

        lista = query.getResultList();
        System.err.println(sql + "FindImovelAll"+lista);
        return lista;
    }
    
}
